package com.example.mybatisplusdemo.service.serviceImp;

import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.example.mybatisplusdemo.mapper.BSFMapper;
import com.example.mybatisplusdemo.mapper.UserMapper;
import com.example.mybatisplusdemo.pojo.User;
import com.example.mybatisplusdemo.pojo.bsf;
import com.example.mybatisplusdemo.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.List;

/**
 * TODO     mybatis-plus 实现操作数据库
 *          mybatis-plus 多表操作 可使用插件 mybatis-plus-join, 实现 mybatis-plus 的多表联查操作
 *
 * @ClassName UserServiceImpl
 * @Author xiaojiang
 * @Date 2021/10/25 下午 15:06
 */
@Service
public class UserServiceImpl implements UserService {

    @Autowired
    UserMapper userMapper;

    @Autowired
    BSFMapper bsfMapper;

    /*---------------------------- 基本的CURD -----------------------------------------------*/
    /**
     *  TODO  查询所有用户
     * @Param :
     * @return List<User>
     * @Author 江
     * @Date 2021/10/25 下午 15:30
     */
    @Override
    public List<User> getList() {
        List<User> users = userMapper.selectList(null);
        System.out.println("查询到的数据是：" + users);
        return users;
    }

    @Override
    public List<bsf> getBSFList() {
        List<bsf> bsfs = bsfMapper.selectList(null);
        System.out.println("查询到的数据是：" + bsfs);
        return bsfs;
    }

    /**
     *  TODO    insert操作
     *          BaseMapper直接提供一个insert()方法，传一个实体类
     * @Param : user
     * @return int  1 = "success
     * @Author 江
     * @Date 2021/10/25 下午 15:31
     */
    @Override
    public int insertOne(User user) {

        return userMapper.insert(user);
    }

    /**
     *  TODO  update操作
     *        BaseMapper直接提供一个updateById()方法，传一个实体类。
     * @Param : user
     * @return int
     * @Author 江
     * @Date 2021/10/25 下午 15:55
     */
    @Override
    public int updateOne(User user) {
        return userMapper.updateById(user);
    }

    /**
     *  TODO  delete操作
     *        BaseMapper直接提供一个deleteById()方法，传主键值
     * @Param : id
     * @return int
     * @Author 江
     * @Date 2021/10/25 下午 16:00
     */
    @Override
    public int deleteOne(String id) {
        return userMapper.deleteById(id);
    }

    /**
     *  TODO   批量删除deleteBatchIds方法，传主键值的集合
     * @Param : ids
     * @return int
     * @Author 江
     * @Date 2021/10/25 下午 16:01
     */
    @Override
    public int deleteBatch(List<String> ids) {
        return userMapper.deleteBatchIds(ids);
    }

    /*---------------------------- 条件构造器(Wrapper) -----------------------------------------------*/
    /*Wrapper通俗点理解就是定义where语句后面的查询条件，
    是Mybatis-Plus里功能比较强大的工具，
    Wrapper是一个抽象类，下面有很多子类
    常用的子类实现有四个，分别是：
        QueryWrapper       :     主要用于生成where条件
        UpdateWrapper      :     上述的设置条件的方法都有，不同的是，UpdateWrapper会有set()和setSql()设置更新的值
        LambdaQueryWrapper :     用LambdaQueryWrapper的好处在于消除硬编码
        LambdaUpdateWrapper:     跟上面差不多，LambdaUpdateWrapper也可以消除硬编码
        */
    /*---------------------------- QueryWrapper -----------------------------------------------*/
    /**
     *  TODO  用name查询user表
     * @Param : name
     * @return List<User>
     * @Author 江
     * @Date 2021/10/25 下午 16:17
     */
    @Override
    public List<User> queryUserByName(String name) {
        //相当于：SELECT * FROM user WHERE name = ?
        QueryWrapper<User> queryWrapper = new QueryWrapper<>();
        //eq()表示相等
        queryWrapper.eq("name", name);
        //数字可以使用以下
        //小于是lt()
        //大于等于是ge()
        //小于等于是le()
        //范围的话，则使用between()
        return userMapper.selectList(queryWrapper);
    }

    /**
     *  TODO  like查询
     * @Param : name
     * @return List<User>
     * @Author 江
     * @Date 2021/10/25 下午 16:18
     */
    @Override
    public List<User> queryUserLikeName(String name) {
        //相当于：SELECT * FROM user WHERE name like %#{name}%
        QueryWrapper<User> queryWrapper = new QueryWrapper<>();
        queryWrapper.like("name",name);
        return userMapper.selectList(queryWrapper);
    }

    /**
     *  TODO  过滤字段为空的
     * @Param :
     * @return List<User>
     * @Author 江
     * @Date 2021/10/25 下午 16:23
     */
    @Override
    public List<User> queryUserByNameNotNull() {
        //相当于：SELECT * FROM user WHERE name IS NOT NULL
        QueryWrapper<User> queryWrapper = new QueryWrapper<>();
        queryWrapper.isNotNull("name");
        //查询某个字段为空，则使用isNull()
        //queryWrapper.isNull("name");
        return userMapper.selectList(queryWrapper);
    }

    /**
     *  TODO  IN查询
     * @Param : ids
     * @return List<User>
     * @Author 江
     * @Date 2021/10/25 下午 16:25
     */
    @Override
    public List<User> queryUserByIds(List<String> ids) {
        //相当于：SELECT * FROM user WHERE name IN ('id1','id2');
        QueryWrapper<User> queryWrapper = new QueryWrapper<>();
        queryWrapper.in("id", ids);
        //相反也提供了notIn()方法
        return userMapper.selectList(queryWrapper);
    }

    /**
     *  TODO  排序
     * @Param :
     * @return List<User>
     * @Author 江
     * @Date 2021/10/25 下午 16:27
     */
    @Override
    public List<User> queryUserOrderByAge() {
        //相当于：SELECT * FROM user ORDER BY age ASC
        QueryWrapper<User> queryWrapper = new QueryWrapper<>();
        queryWrapper.orderByAsc("age");
        //相反的，如果降序则使用orderByDesc()方法
        return userMapper.selectList(queryWrapper);
    }

    /**
     *  TODO   子查询
     * @Param :
     * @return List<User>
     * @Author 江
     * @Date 2021/10/25 下午 16:28
     */
    @Override
    public List<User> queryUserInSql() {
        //相当于：SELECT * FROM user WHERE id IN (SELECT id FROM user WHERE age > 30)
        QueryWrapper<User> queryWrapper = new QueryWrapper<>();
        queryWrapper.inSql("id","select id from user where age > 30");
        return userMapper.selectList(queryWrapper);
    }

    /*-------------------------------- UpdateWrapper ------------------------------------------------*/
    /**
     *  TODO  根据 id 修改一个参数
     * @Param : id 要修改的id
     * @Param : name 修改后的名字
     * @return int
     * @Author 江
     * @Date 2021/10/25 下午 17:44
     */
    @Override
    public int updateUserNameById(String id, String name) {
        //相当于：UPDATE user SET name = ? where id = ?
        UpdateWrapper<User> userUpdateWrapper = new UpdateWrapper<>();
        userUpdateWrapper.eq("id", id);
        //设置set关键字后面的语句，相当于set name = #{name}
        userUpdateWrapper.set("name", name);
        return userMapper.update(new User(), userUpdateWrapper);
    }

    /**
     *  TODO  setSql()就是设置SET关键字后面拼接的部分SQL语句
     *        setSql()就是纯粹的SQL语句拼接，我们可以看到SET后面接的是name=''，而不是占位符，会有SQL注入的风险
     * @Param : id
     * @Param : name
     * @return int
     * @Author 江
     * @Date 2021/10/25 下午 17:48
     */
    @Override
    public int updateUserBySql(String id, String name) {
        //相当于：UPDATE user SET name = ? where id = ?
        UpdateWrapper<User> userUpdateWrapper = new UpdateWrapper<>();
        // setSql()就是设置SET关键字后面拼接的部分SQL语句
        userUpdateWrapper.setSql("name = '" + name + "'");
        userUpdateWrapper.eq("id", id);
        return userMapper.update(new User(), userUpdateWrapper);
    }

    /*----------------------------- LambdaQueryWrapper -----------------------------------------------*/
    /**
     *  TODO  消除硬编码的用name查询user表
     * @Param : name
     * @return List<User>
     * @Author 江
     * @Date 2021/10/25 下午 17:52
     */
    @Override
    public List<User> lambdaQueryUserByName(String name) {
        //QueryWrapper<User> queryWrapper = new QueryWrapper<>();
        //使用"name"字符串，就是硬编码
        //queryWrapper.eq("name", name);
        //相当于：SELECT id,name,age FROM user WHERE name = ?
        LambdaQueryWrapper<User> lambdaQueryWrapper = new QueryWrapper<User>().lambda();
        lambdaQueryWrapper.eq(User::getName, name);
        return userMapper.selectList(lambdaQueryWrapper);
    }

    /**
     *  TODO  消除硬编码的模糊查询
     * @Param : name
     * @return List<User>
     * @Author 江
     * @Date 2021/10/25 下午 17:54
     */
    @Override
    public List<User> lambdaQueryUserLikeName(String name) {
        LambdaQueryWrapper<User> lambdaQueryWrapper = new QueryWrapper<User>().lambda();
        lambdaQueryWrapper.like(User::getName, name);
        return userMapper.selectList(lambdaQueryWrapper);
    }

    /*---------------------------- LambdaUpdateWrapper -----------------------------------------------*/
    /**
     *  TODO  消除硬编码的进行修改
     * @Param : id
     * @Param : name
     * @return int
     * @Author 江
     * @Date 2021/10/25 下午 17:56
     */
    @Override
    public int lambdaUpdateUserNameById(String id, String name) {
        //相当于：UPDATE user SET name=? WHERE id = ?
        LambdaUpdateWrapper<User> lambdaUpdateWrapper = new UpdateWrapper<User>().lambda();
        lambdaUpdateWrapper.set(User::getName, name);
        lambdaUpdateWrapper.eq(User::getId, id);
        return userMapper.update(new User(), lambdaUpdateWrapper);
    }

    /*------------------------------------ 分页查询 --------------------------------------------------*/
    /**
     *  TODO  分页查询
     * @Param : pageNo   当前页码
     * @Param : pageSize 每页显示数
     * @Param : name
     * @return IPage<User>
     * @Author 江
     * @Date 2021/10/25 下午 18:01
     */
    @Override
    public IPage<User> selectPageByName(long pageNo, long pageSize, String name) {
        Page<User> page = new Page<>();
        //设置当前页码
        page.setCurrent(pageNo);
        //设置每页显示数
        page.setSize(pageSize);
        return userMapper.selectPageByName(page, name);
    }

    /**
     * @TODO    分页查询2
     * @Param : pageNo
     * @Param : pageSize
     * @Param : name
     * @return IPage<User>
     * @Author 江
     * @Date 2022/9/17 12:47
     */
    @Override
    public IPage<User> selectPageByNameTwo(long pageNo, long pageSize, String name) {
        Page<User> page = new Page<>();
        //设置当前页码
        page.setCurrent(pageNo);
        //设置每页显示数
        page.setSize(pageSize);
        //相当于：SELECT * FROM user WHERE name = ?
        QueryWrapper<User> queryWrapper = new QueryWrapper<>();
        //eq()表示相等
        queryWrapper.like("name", name);
        //数字可以使用以下
        //小于是lt()
        //大于等于是ge()
        //小于等于是le()
        //范围的话，则使用between()
        return userMapper.selectPage(page, queryWrapper);
        //return userMapper.selectPageByName(page, name);
    }





}
